import {defineStore} from "pinia";

import {getRouters} from "@/api/system/menu.ts";
import Layout from '@/layout/index.vue'

const modules = import.meta.glob('./../../views/**/*.vue')


const usePermissionStore = defineStore(
    "permission", {
        state: () => {
            return {
                routes: [],
                sidebarRouters: []
            }
        },
        actions: {
            setSidebarRouters(routes: any) {
                // console.log('router',routes)
                this.sidebarRouters = routes
            },
            generateRoutes() {
                return new Promise(resolve => {
                    // 向后端请求路由数据
                    getRouters().then(res => {
                        const SideData = JSON.parse(JSON.stringify(res.data))
                        const rdata = JSON.parse(JSON.stringify(res.data))
                        this.setSidebarRouters(SideData);
                        const rewriteRoutes = filterAsyncRouter(rdata, false, true)
                        resolve(rewriteRoutes);
                    })
                })
            }
        }
    }
)

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap: any, lastRouter = false, type = false) {
    return asyncRouterMap.filter((route: any) => {
        if (type && route.children) {
            route.children = filterChildren(route.children)
        }
        if (route.component) {
            // Layout ParentView 组件特殊处理
            if (route.component === 'Layout') {
                route.component = Layout
            }
                // else if (route.component === 'ParentView') {
                //     route.component = ParentView
                // } else if (route.component === 'InnerLink') {
                //     route.component = InnerLink
            // }
            else {
                route.component = loadView(route.component)
            }
        }
        if (route.children != null && route.children && route.children.length) {
            route.children = filterAsyncRouter(route.children, route, type)
        } else {
            delete route['children']
            delete route['redirect']
        }
        return true
    })
}

function filterChildren(childrenMap: any, lastRouter = false) {
    let children: any[] = []
    childrenMap.forEach((el: any) => {
        if (el.children && el.children.length) {
            if (el.component === 'ParentView' && !lastRouter) {
                el.children.forEach((c: any) => {
                    c.path = el.path + '/' + c.path
                    if (c.children && c.children.length) {
                        children = children.concat(filterChildren(c.children, c))
                        return
                    }
                    children.push(c)
                })
                return
            }
        }
        if (lastRouter) {
            el.path = lastRouter.path + '/' + el.path
        }
        children = children.concat(el)
    })
    return children
}

export const loadView = (view: any) => {
    // console.log(modules,'66666')
    let res;
    for (const path in modules) {

        const dir = path.split('views/')[1].split('.vue')[0];

        if (dir === view) {
            // console.log(path,'path')
            // console.log(dir,'dir')
            // console.log(view,'view')
            res = () => modules[path]();
        }
    }
    // console.log(res,'res')
    return res;
}

export default usePermissionStore
